package code.ws_common_utils
{
	import flash.geom.Point;
	

	/**
	 * 算法全局对象 
	 * @author qiangchen
	 * 
	 */	
	public class MathUtils
	{
		/** 默认移动速度 */
		public static const defaultSpeed:int = 160;
		
		/** 方向 */
		private static const DIR_OBJ:Object = { "0,-1": 0,
												"1,-1": 1,
												"1,0": 2,
												"1,1": 3,
												"0,1": 4,
												"-1,1": 5,
												"-1,0": 6,
												"-1,-1": 7
											  };
		
		
		/**
		 * 通过模型与鼠标点击目标点的夹角获取模型方向（像素值判断）
		 * @param angle
		 * 
		 */		
		public static function getRealDirByPixel( angle:Number ):int
		{
			var dir:int = 0;
			if( angle >= -20 && angle <= 20 )
			{
				// 左
				dir = 6;
			}
			else if( angle >= -70 && angle < -20 )
			{
				// 左下
				dir = 5;
			}
			else if( angle < -70 && angle >= -110 )
			{
				// 下
				dir = 4;
			}
			else if( angle < -110 && angle >= -160 )
			{
				// 右下
				dir = 3;
			}
			else if( angle >20 && angle <= 70 )
			{
				// 左上
				dir = 7;
			}
			else if( angle > 70 && angle <= 110 )
			{
				// 上
				dir = 0;
			}
			else if( angle > 110 && angle < 160 )
			{
				// 右上
				dir = 1;
			}
			else 
			{
				// 左
				dir = 2;
			}
			angle = NaN;
			return dir;
		}
		
		
		/**
		 * 通过逻辑格子点获取模型转向 
		 * @param sp	起式点
		 * @param ep	目标点
		 * @return 
		 * 
		 */		
		public static function getRealDirByTile( sp:Point, ep:Point ):int
		{
			var dx:int = ep.x - sp.x;
			var dy:int = ep.y - sp.y;
			return int( DIR_OBJ[ dx + "," + dy ] );
		}
		
		
		
		/**
		 * 获取模型移动时间
		 * @param dir
		 * @param speed
		 * @return 
		 * 
		 */		
		public static function getMoveTime( dir:int, speed:int ):Number
		{
			/* 1 -> 二进制 0001
			 * 3 -> 二进制0011
			 * 5 -> 二进制0101
			 * 7 -> 二进制0111*/ 
			return ((( dir & 1 ) == 1) ? 1.4 : 1 ) / 1000 * speed;
		}
		
		
		/**
		 * 创建值 
		 * @param cv 中心值
		 * @param r 围绕中心值的范围半径
		 * @param compareVal 比较值
		 * @return 
		 * 
		 */		
		public static function cValInCompare( cv:int, r:int, compareVal:int ):int
		{
			var multiple:int = r * 1.5;
			var final:int = cv - r + int(Math.random() * multiple );
			while( final == compareVal )
			{
				final = cv - r + int(Math.random() * multiple );
			}
			
			cv = r = multiple = compareVal = NaN;
			return final;
		}
	}
}